package util

import "math"

// 杯子层数
var GlassLayers int

// 香槟塔算法
func ChampagneTower(glassNum float64, queryRow int, queryGlass int) float64 {
	// 根据定义的杯子层数数量初始化二维数组
	capacity := make([][]float64, GlassLayers)
	for i := range capacity {
		capacity[i] = make([]float64, GlassLayers)
	}
	// 初始化倒了多少杯酒
	capacity[0][0] = glassNum
	for i := 0; i <= queryRow; i++ {
		for j := 0; j <= i; j++ {
			// 当前杯子酒量减去自身杯子需求量除2得到下一层杯子存的酒量
			remain := (capacity[i][j] - 1.0) / 2
			if remain > 0 {
				// 如果大于0就装到杯子里
				capacity[i+1][j] += remain
				capacity[i+1][j+1] += remain
			}
		}
	}
	// 返回杯子酒量
	return math.Min(capacity[queryRow][queryGlass], 1.0)
}
